home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1996 July: Mac OS SDK / Dev.CD Jul 96 SDK / Dev.CD Jul 96 SDK1.toast / Development Kits (Disc 1) / OpenDoc / OpenDoc Development / Debugging Support / OpenDoc Source Code / Binding / PartWrap.cpp < prev   
Encoding:
Text File  |  1996-04-22  |  36.9 KB  |  1,586 lines  |  [TEXT/MPS ]

  1. /*
  2.     File:        PartWrap.cpp
  3.  
  4.     Contains:    Implementation of class ODPartWrapper
  5.  
  6.     Owned by:    Caia Grisar
  7.  
  8.     Copyright:    © 1994 - 1995 by Apple Computer, Inc., all rights reserved.
  9.  
  10.     Change History (most recent first):
  11.  
  12.         <39>    10/23/95    CG        #1295082 GM: Crash switching editor if lib
  13.                                     can't load
  14.                                     #1295186 GM: Failure in InitPartFromStorage
  15.                                     doesn't abort editor switch
  16.         <38>    10/17/95    jpa        1289153: Don't crash releasing/deleting
  17.                                     before _fPart exists.
  18.         <37>     10/8/95    TJ        Fixes Recomended by Refball
  19.         <36>     10/3/95    TJ        Changes done by RefBall Team
  20.         <35>     9/21/95    JBS        1284283 externalize WindowState in
  21.                                     UseEditor
  22.         <34>      9/1/95    CC        1274788: Externalize: Removed code to set
  23.                                     part name (already done by ODPart).
  24.         <33>     8/26/95    TÇ        1273191 Lets eliminate
  25.                                     ODObject::IsInitialized
  26.         <32>     8/25/95    JBS        1263078 FB: fix part editor swapping
  27.         <31>     8/21/95    VL        1277291: Added #include <StorUtil.h>.
  28.         <30>     8/12/95    TÇ        1276812 Need to use TempObjs and TempRefs
  29.                                     for exception safety and to avoid TRY
  30.                                     blocks
  31.         <29>      8/3/95    RR        #1257260: Collapse B classes. Remove
  32.                                     somInit methods. Don't call IsInitialized
  33.                                     or SubclassResponsibility
  34.         <28>     6/19/95    VL        1170098: Used DeleteRealPart.
  35.         <27>      6/2/95    CC        1255477: Deligate EditInLinkAttempted to
  36.                                     fPart.
  37.         <26>     5/26/95    DM        1251403: Multithreading naming support.
  38.         <25>     5/25/95    jpa        Fixed usage of ODDebug. [1253321]
  39.         <24>     5/17/95    VL        1170098: Moved creation of real part back
  40.                                     to draft.
  41.         <23>     5/17/95    RR        #1250135/1250137/1250143 Getters increment
  42.                                     refcount
  43.         <22>      5/1/95    CG        #1241628    BB: SOM_TRY blocks needed in
  44.                                     Binding SOM methods.
  45.         <21>     4/30/95    TÇ        1241263 BB: ODPart::Externalize should
  46.                                     initialize part name if the part name is
  47.                                     empty
  48.         <20>     4/13/95    CG        #1231608: UseEditor should do nothing if
  49.                                     parameter is current editor.
  50.         <19>     4/13/95    JBS        1233726 add ClonePartInfo; 1238250 Frame
  51.                                     PartInfo should have multiple values;
  52.                                     1228451 call draft->ReleasePart when
  53.                                     refcount reaches 0
  54.         <18>      4/6/95    RR        # 1180527 Check for unrelinquished foci in
  55.                                     FrameClosed and FrameRemoved
  56.         <17>      3/7/95    CC        1224121: CreateLink() returns an
  57.                                     ODLinkSource object.
  58.         <16>     2/24/95    CG        1147225 BB: Changing Editors in Part Info
  59.                                     fixed.
  60.         <15>     2/16/95    CG        #1210975 BB:  New kODErrPartInUse error.
  61.         <14>     2/16/95    CG        #1209517 BB: Undo stack is cleared when
  62.                                     editor is changed
  63.         <13>     1/26/95    eeh        1213354: ODActionData now an ODByteArray.
  64.         <12>     1/22/95    NP        EmbeddedFrameSpec signature changed because
  65.                                     of change to AE types.
  66.         <11>     1/20/95    JBS        1195017, 1205669: part API changes
  67.         <10>     1/13/95    RR        1192147, 1201708 Removed overrides of
  68.                                     HandleEventInEmbedded, MouseEnter,
  69.                                     MouseWithin and MouseLeave. Moved
  70.                                     functionality to HandleEvent
  71.          <9>    12/23/94    JBS        1186869: hide ODPartWrapper from public
  72.                                     API; 1192557: ODPartWrapper realPart access
  73.          <8>    12/20/94    CG        #1201428: Added SOM_CATCH to all methods.
  74.          <7>    12/15/94    CC        1197221 CreateLink() takes ODByteArray
  75.                                     parameter.
  76.                                     1205684 LinkUdated parameter renamed to
  77.                                     "change" from "id".
  78.          <6>    10/27/94    CG        #1147225: Removed call to ODDeleteObject in
  79.                                     UseEditor() which was causing editor
  80.                                     swapping to crash.
  81.          <5>     9/29/94    RA        1189812: Mods for 68K build.
  82.          <4>     9/23/94    CC        1188476 - InitPartWrapper() does not
  83.                                     terminate ODEditor string of wrapped
  84.                                     editor.
  85.          <3>     9/21/94    CG        #1187347: Part Editor now save the current
  86.                                     editor for part in fEditor.
  87.          <2>     9/19/94    TÇ        #1187347 PartWrapper Needs a mechanism for
  88.                                     getting the current editor & real part
  89.          <1>      9/9/94    CG        first checked in
  90.          <7>      9/1/94    CC        RADAR #1183005 - change AdjustBorderShape
  91.                                     param from Frame to Facet (for JBS)
  92.          <6>     8/28/94    VL        #1182975: DragEnter & DragWithin should
  93.                                     return ODDragResult (instead of ODBoolean).
  94.          <5>     8/26/94    TÇ        #1183531 PartWrapper implementation, delete
  95.                                     _fPart when somUninit is called.
  96.          <4>     8/25/94    TÇ        #1183531 PartWrapper implementation
  97.          <3>     8/16/94    VL        1143605: Fixed parameters to CloneInto.
  98.          <2>     8/15/94    TÇ        #1180814 Fix InitPart methods to comply
  99.                                     with new Part API
  100.          <1>     8/13/94    TÇ        first checked in
  101.  
  102.     In Progress:
  103.         
  104. */
  105.  
  106. #ifndef SOM_ODFrame_xh
  107. #include <Frame.xh>
  108. #endif
  109.  
  110. #ifndef SOM_ODFacet_xh
  111. #include <Facet.xh>
  112. #endif
  113.  
  114. #ifndef SOM_ODShape_xh
  115. #include <Shape.xh>
  116. #endif
  117.  
  118. #ifndef SOM_ODTransform_xh
  119. #include <Trnsform.xh>
  120. #endif
  121.  
  122. #ifndef SOM_ODWindow_xh
  123. #include <Window.xh>
  124. #endif
  125.  
  126. #ifndef SOM_ODDraft_xh
  127. #include <Draft.xh>
  128. #endif
  129.  
  130. #ifndef SOM_ODStorageUnit_xh
  131. #include <StorageU.xh>
  132. #endif
  133.  
  134. #ifndef _ODNEWOBJ_
  135. #include "ODNewObj.h"
  136. #endif
  137.  
  138. #ifndef _ODUTILS_
  139. #include "ODUtils.h"
  140. #endif
  141.  
  142. #ifndef _STDTYPIO_
  143. #include "StdTypIO.h"
  144. #endif
  145.  
  146. #ifndef _TEMPOBJ_
  147. #include "TempObj.h"
  148. #endif
  149.  
  150. #ifndef _INFOUTIL_
  151. #include "InfoUtil.h"
  152. #endif
  153.  
  154. #ifndef __QUICKDRAW__
  155. #include <Quickdraw.h>
  156. #endif
  157.  
  158. #ifndef SOM_Apple_NoPart_xh
  159. #include <NoPart.xh>
  160. #endif
  161.  
  162. #ifndef _ISOSTR_
  163. #include "ISOStr.h"
  164. #endif
  165.  
  166. #ifndef SOM_ODUndo_xh
  167. #include <Undo.xh>
  168. #endif
  169.  
  170. #ifndef SOM_ODWindowState_xh
  171. #include <WinStat.xh>
  172. #endif
  173.  
  174. #if ODDebug
  175. #ifndef SOM_ODArbitrator_xh
  176. #include <Arbitrat.xh>
  177. #endif
  178.  
  179. #ifndef SOM_Module_OpenDoc_Foci_defined
  180. #include "Foci.xh"
  181. #endif
  182.  
  183. #ifndef _EXCEPT_
  184. #include <Except.h>
  185. #endif
  186. #endif
  187.  
  188. #ifndef SOM_Module_OpenDoc_StdDefs_defined
  189. #include <StdDefs.xh>
  190. #endif
  191.  
  192. #ifndef SOM_Module_OpenDoc_StdTypes_defined
  193. #include <StdTypes.xh>
  194. #endif
  195.  
  196. #ifndef SOM_Module_OpenDoc_StdProps_defined
  197. #include <StdProps.xh>
  198. #endif
  199.  
  200. #ifndef _STORUTIL_
  201. #include <StorUtil.h>
  202. #endif
  203.  
  204. #pragma segment  PartWrapper
  205.  
  206. #define ODPartWrapper_Class_Source
  207. #define VARIABLE_MACROS
  208. #include <PartWrap.xih>
  209.  
  210. //==============================================================================
  211. // ODPartWrapper
  212. //==============================================================================
  213.  
  214. SOM_Scope void  SOMLINK ODPartWrapperInitPartWrapper(ODPartWrapper *somSelf, Environment *ev)
  215. {
  216.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  217.     
  218. }
  219.  
  220. SOM_Scope void  SOMLINK ODPartWrapperSetRealPart(ODPartWrapper *somSelf, Environment *ev,
  221.         ODPart* realPart, ODEditor editor)
  222. {
  223.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  224.     
  225.     SOM_TRY
  226.         
  227.     _fPart = realPart;
  228.  
  229.     ODUShort length = (ODUShort)ODISOStrLength(editor);
  230.     _fEditor = (ODEditor)ODNewPtrClear( length+1 );
  231.     ODBlockMove(editor,  _fEditor, length+1 );
  232.     
  233.     SOM_CATCH_ALL
  234.     SOM_ENDTRY
  235. }
  236.  
  237. SOM_Scope void  SOMLINK ODPartWrapperUseEditor(ODPartWrapper *somSelf, Environment *ev,
  238.         ODEditor editor)
  239. {
  240.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  241.     
  242.     SOM_TRY
  243.  
  244.     ODEditor oldEditor = kODNULL;
  245.     ODULong currentRefCount = 0;
  246.     ODStorageUnit* su = kODNULL;
  247.     ODDraft* draft = kODNULL;
  248.     ODSession* session = kODNULL;
  249.     ODPart* newRealPart = kODNULL;
  250.     ODULong i = 0;
  251.     ODError errorCode = kODNoError;
  252.     
  253.     oldEditor = somSelf->GetEditor(ev);
  254.     if ( !ODISOStrEqual( editor, oldEditor) )
  255.     {
  256.         if (_fPartInUse)
  257.             THROW(kODErrPartInUse);
  258.         else
  259.         {
  260.             if (_fPart)
  261.             {
  262.                 su = _fPart->GetStorageUnit(ev);
  263.                 su->Acquire(ev);
  264.                 TempODStorageUnit tempSU = su; // ensure it's released
  265.                 draft = su->GetDraft(ev);
  266.     
  267.                 session = su->GetSession(ev);
  268.                 session->GetUndo(ev)->ClearActionHistory(ev, kODDontRespectMarks);
  269.                 session->GetWindowState(ev)->Externalize(ev, draft);
  270.     
  271.                 _fPart->Acquire(ev);    // prevent frame closing from releasing part to zero refcount
  272.                 TRY
  273.                     draft->SwapPart(ev, somSelf);
  274.                 CATCH_ALL
  275.                     _fPart->Release(ev);
  276.                     RERAISE;
  277.                 ENDTRY
  278.         
  279.                 currentRefCount = _fPart->GetRefCount(ev);
  280.                 for (i=currentRefCount; i>0; --i)
  281.                     _fPart->Release(ev);
  282.             
  283.                 draft->ReleaseRealPart(ev, _fPart);
  284.                 
  285.                 TRY
  286.                     newRealPart = draft->ConstructRealPart(ev,
  287.                                             su, kODTrue, somSelf, kODNULL, editor);
  288.                     somSelf->SetRealPart(ev, newRealPart, editor);
  289.                 CATCH_ALL
  290.                     TRY
  291.                         newRealPart = draft->ConstructRealPart(ev,
  292.                                                 su, kODTrue, somSelf, kODNULL, oldEditor);
  293.                     CATCH_ALL
  294.                         newRealPart = draft->ConstructRealPart(ev,
  295.                                                 su, kODTrue, somSelf, kODNULL, kODBlackBoxHandlerOfLastResort);
  296.                     ENDTRY
  297.                     somSelf->SetRealPart(ev, newRealPart, oldEditor);
  298.                     errorCode = ErrorCode();
  299.                 ENDTRY
  300.             }
  301.             else
  302.             {
  303.                 // $$$$$ this case should never occur, I don't think UseEditor is
  304.                 // called to create new parts anymore. --JBS
  305.                 newRealPart = draft->ConstructRealPart(ev, kODNULL, kODFalse, somSelf, kODNULL, editor);
  306.                 somSelf->SetRealPart(ev, newRealPart, editor);
  307.             }
  308.             
  309.             if (_fPart)
  310.             {                        
  311.                 for (i=currentRefCount; i>1; --i)  // 1 not 0 because part created with rc = 1.
  312.                     _fPart->Acquire(ev);    
  313.             }
  314.             
  315.             if (session) // implies part was swapped above
  316.             {
  317.                 _fPart->Release(ev);    // balance acquire before SwapPart above
  318.                 session->GetWindowState(ev)->Internalize(ev, draft);
  319.             }
  320.         }
  321.     }
  322.     
  323.     THROW_IF_ERROR(errorCode);  // let user know editor didn't get swapped
  324.     
  325.     SOM_CATCH_ALL
  326.     SOM_ENDTRY
  327. }
  328.  
  329. SOM_Scope ODEditor  SOMLINK ODPartWrapperGetEditor(ODPartWrapper *somSelf, Environment *ev)
  330. {
  331.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  332.     
  333.     return _fEditor;
  334. }
  335. /*
  336. SOM_Scope void  SOMLINK ODPartWrappersomInit(ODPartWrapper *somSelf)
  337. {
  338.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  339.  
  340.     _fPart = kODNULL;
  341.     parent_somInit(somSelf);
  342. }
  343. */
  344. SOM_Scope void  SOMLINK ODPartWrappersomUninit(ODPartWrapper *somSelf)
  345. {
  346.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  347.  
  348.     ODDeleteObject(_fEditor);
  349.     if( _fPart ) {
  350.         TRY{
  351.             Environment* ev = somGetGlobalEnvironment();
  352.             _fPart->GetStorageUnit(ev)->GetDraft(ev)->DeleteRealPart(ev, _fPart);
  353.         }CATCH_ALL{
  354.             // ignore exception
  355.         }ENDTRY
  356.     }
  357. }
  358.  
  359. SOM_Scope void  SOMLINK ODPartWrapperFulfillPromise(ODPartWrapper *somSelf, Environment *ev,
  360.         ODStorageUnitView* promiseSUView)
  361. {
  362.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  363.     
  364.     SOM_TRY
  365.  
  366.     _fPart->FulfillPromise(ev,promiseSUView);
  367.  
  368.     SOM_CATCH_ALL
  369.     SOM_ENDTRY
  370. }
  371.  
  372. SOM_Scope void  SOMLINK ODPartWrapperDropCompleted(ODPartWrapper *somSelf, Environment *ev,
  373.         ODPart* destPart,
  374.         ODDropResult dropResult)
  375. {
  376.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  377.     
  378.     SOM_TRY
  379.  
  380.     _fPart->DropCompleted(ev,destPart,dropResult);
  381.     
  382.     SOM_CATCH_ALL
  383.     SOM_ENDTRY
  384. }
  385.  
  386. SOM_Scope ODDragResult  SOMLINK ODPartWrapperDragEnter(ODPartWrapper *somSelf, Environment *ev,
  387.         ODDragItemIterator* dragInfo,
  388.         ODFacet* facet,
  389.         ODPoint* where)
  390. {
  391.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  392.     ODDragResult    dragResult = kODFalse;
  393.     
  394.     SOM_TRY
  395.     
  396.     dragResult = _fPart->DragEnter(ev,dragInfo,facet,where);
  397.  
  398.     SOM_CATCH_ALL
  399.     SOM_ENDTRY
  400.  
  401.     return dragResult;
  402. }
  403.  
  404. SOM_Scope ODDragResult  SOMLINK ODPartWrapperDragWithin(ODPartWrapper *somSelf, Environment *ev,
  405.         ODDragItemIterator* dragInfo,
  406.         ODFacet* facet,
  407.         ODPoint* where)
  408. {
  409.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  410.     ODDragResult    dragResult = kODFalse;
  411.     
  412.     SOM_TRY
  413.     
  414.     dragResult = _fPart->DragWithin(ev,dragInfo,facet,where);
  415.  
  416.     SOM_CATCH_ALL
  417.     SOM_ENDTRY
  418.  
  419.     return dragResult;
  420. }
  421.  
  422. SOM_Scope void  SOMLINK ODPartWrapperDragLeave(ODPartWrapper *somSelf, Environment *ev,
  423.         ODFacet* facet,
  424.         ODPoint* where)
  425. {
  426.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  427.     
  428.     SOM_TRY
  429.     
  430.     _fPart->DragLeave(ev,facet,where);
  431.  
  432.     SOM_CATCH_ALL
  433.     SOM_ENDTRY
  434. }
  435.  
  436. SOM_Scope ODDropResult  SOMLINK ODPartWrapperDrop(ODPartWrapper *somSelf, Environment *ev,
  437.         ODDragItemIterator* dropInfo,
  438.         ODFacet* facet,
  439.         ODPoint* where)
  440. {
  441.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  442.     
  443.     ODDragResult    dragResult = kODDropFail;
  444.     
  445.     SOM_TRY
  446.     
  447.     dragResult = _fPart->Drop(ev,dropInfo,facet,where);
  448.  
  449.     SOM_CATCH_ALL
  450.     SOM_ENDTRY
  451.  
  452.     return dragResult;
  453. }
  454.  
  455. SOM_Scope void  SOMLINK ODPartWrapperContainingPartPropertiesUpdated(ODPartWrapper *somSelf, Environment *ev,
  456.         ODFrame* frame,
  457.         ODStorageUnit* propertyUnit)
  458. {
  459.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  460.     
  461.     SOM_TRY
  462.     
  463.     _fPart->ContainingPartPropertiesUpdated(ev,frame,propertyUnit);
  464.  
  465.     SOM_CATCH_ALL
  466.     SOM_ENDTRY
  467. }
  468.  
  469. SOM_Scope ODStorageUnit*  SOMLINK ODPartWrapperAcquireContainingPartProperties(ODPartWrapper *somSelf, Environment *ev,
  470.         ODFrame* frame)
  471. {
  472.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  473.     ODStorageUnit* partProps = kODNULL;
  474.     
  475.     SOM_TRY
  476.     
  477.     partProps = _fPart->AcquireContainingPartProperties(ev,frame);
  478.  
  479.     SOM_CATCH_ALL
  480.     SOM_ENDTRY
  481.  
  482.     return partProps;
  483. }
  484.  
  485. SOM_Scope ODBoolean  SOMLINK ODPartWrapperRevealFrame(ODPartWrapper *somSelf, Environment *ev,
  486.         ODFrame* embeddedFrame,
  487.         ODShape* revealShape)
  488. {
  489.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  490.     ODBoolean    revealFrame = kODFalse;
  491.  
  492.     SOM_TRY
  493.  
  494.     revealFrame = _fPart->RevealFrame(ev,embeddedFrame,revealShape);
  495.  
  496.     SOM_CATCH_ALL
  497.     SOM_ENDTRY
  498.  
  499.     return revealFrame;
  500. }
  501.  
  502. SOM_Scope void  SOMLINK ODPartWrapperEmbeddedFrameSpec(ODPartWrapper *somSelf, Environment *ev,
  503.         ODFrame* embeddedFrame,
  504.         ODObjectSpec* spec)
  505. {
  506.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  507.     
  508.     SOM_TRY
  509.     
  510.     _fPart->EmbeddedFrameSpec(ev,embeddedFrame,spec);
  511.  
  512.     SOM_CATCH_ALL
  513.     SOM_ENDTRY
  514. }
  515.  
  516. SOM_Scope ODEmbeddedFramesIterator*  SOMLINK ODPartWrapperCreateEmbeddedFramesIterator(ODPartWrapper *somSelf, Environment *ev,
  517.         ODFrame* frame)
  518. {
  519.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  520.     ODEmbeddedFramesIterator*    itr = kODNULL;
  521.     
  522.     SOM_TRY
  523.     
  524.     itr = _fPart->CreateEmbeddedFramesIterator(ev,frame);
  525.  
  526.     SOM_CATCH_ALL
  527.     SOM_ENDTRY
  528.  
  529.     return itr;
  530. }
  531.  
  532. SOM_Scope void  SOMLINK ODPartWrapperDisplayFrameAdded(ODPartWrapper *somSelf, Environment *ev,
  533.         ODFrame* frame)
  534. {
  535.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  536.  
  537.     SOM_TRY
  538.     
  539.     _fPart->DisplayFrameAdded(ev,frame);
  540.  
  541.     SOM_CATCH_ALL
  542.     SOM_ENDTRY
  543. }
  544.  
  545. SOM_Scope void  SOMLINK ODPartWrapperDisplayFrameRemoved(ODPartWrapper *somSelf, Environment *ev,
  546.         ODFrame* frame)
  547. {
  548.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  549.  
  550.     SOM_TRY
  551.  
  552.     _fPart->DisplayFrameRemoved(ev,frame);
  553. #if ODDebug
  554.  
  555.         // Sanity check to make sure parts have relinquished foci.
  556.         // It would be more general to have a private ODArbitrator
  557.         // method to determine if any frames of a part still own
  558.         // foci
  559.         
  560.         ODStorageUnit* su = _fPart->GetStorageUnit(ev);
  561.         ODSession* session = su->GetSession(ev);
  562.         ODArbitrator* arbitrator = session->GetArbitrator(ev);
  563.                 
  564.         {
  565.         TempODFrame focusFrame = arbitrator->AcquireFocusOwner(ev, session->Tokenize(ev, kODSelectionFocus));
  566.         if (focusFrame && ODObjectsAreEqual(ev, frame, focusFrame))
  567.             WARN("DisplayFrameRemoved: Frame %x of Part %x still has selection focus", frame, _fPart);
  568.         }
  569.         {
  570.         TempODFrame focusFrame = arbitrator->AcquireFocusOwner(ev, session->Tokenize(ev, kODMenuFocus));
  571.         if (focusFrame && ODObjectsAreEqual(ev, frame, focusFrame))
  572.             WARN("DisplayFrameRemoved: Frame %x of Part %x still has menu focus", frame, _fPart);
  573.         }
  574.         {
  575.         TempODFrame focusFrame = arbitrator->AcquireFocusOwner(ev, session->Tokenize(ev, kODKeyFocus));
  576.         if (focusFrame && ODObjectsAreEqual(ev, frame, focusFrame))
  577.             WARN("DisplayFrameRemoved: Frame %x of Part %x still has key focus", frame, _fPart);
  578.         }
  579.         {
  580.         TempODFrame focusFrame = arbitrator->AcquireFocusOwner(ev, session->Tokenize(ev, kODScrollingFocus));
  581.         if (focusFrame && ODObjectsAreEqual(ev, frame, focusFrame))
  582.             WARN("DisplayFrameRemoved: Frame %x of Part %x still has scrolling focus", frame, _fPart);
  583.         }
  584.         {
  585.         TempODFrame focusFrame = arbitrator->AcquireFocusOwner(ev, session->Tokenize(ev, kODClipboardFocus));
  586.         if (focusFrame && ODObjectsAreEqual(ev, frame, focusFrame))
  587.             WARN("DisplayFrameRemoved: Frame %x of Part %x still has clipboard focus", frame, _fPart);
  588.         }
  589.  
  590. #endif
  591.  
  592.     SOM_CATCH_ALL
  593.     SOM_ENDTRY
  594. }
  595.  
  596. SOM_Scope void  SOMLINK ODPartWrapperDisplayFrameConnected(ODPartWrapper *somSelf, Environment *ev,
  597.         ODFrame* frame)
  598. {
  599.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  600.  
  601.     SOM_TRY
  602.  
  603.     _fPart->DisplayFrameConnected(ev,frame);
  604.  
  605.     SOM_CATCH_ALL
  606.     SOM_ENDTRY
  607. }
  608.  
  609. SOM_Scope void  SOMLINK ODPartWrapperDisplayFrameClosed(ODPartWrapper *somSelf, Environment *ev,
  610.         ODFrame* frame)
  611. {
  612.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  613.  
  614.     SOM_TRY
  615.  
  616.     _fPart->DisplayFrameClosed(ev,frame);
  617. #if ODDebug
  618.  
  619.         // Sanity check to make sure parts have relinquished foci.
  620.         // It would be more general to have a private ODArbitrator
  621.         // method to determine if any frames of a part still own
  622.         // foci
  623.         
  624.         ODStorageUnit* su = _fPart->GetStorageUnit(ev);
  625.         ODSession* session = su->GetSession(ev);
  626.         ODArbitrator* arbitrator = session->GetArbitrator(ev);
  627.                 
  628.         {
  629.         TempODFrame focusFrame = arbitrator->AcquireFocusOwner(ev, session->Tokenize(ev, kODSelectionFocus));
  630.         if (focusFrame && ODObjectsAreEqual(ev, frame, focusFrame))
  631.             WARN("DisplayFrameClosed: Frame %x of Part %x still has selection focus", frame, _fPart);
  632.         }
  633.         {
  634.         TempODFrame focusFrame = arbitrator->AcquireFocusOwner(ev, session->Tokenize(ev, kODMenuFocus));
  635.         if (focusFrame && ODObjectsAreEqual(ev, frame, focusFrame))
  636.             WARN("DisplayFrameClosed: Frame %x of Part %x still has menu focus", frame, _fPart);
  637.         }
  638.         {
  639.         TempODFrame focusFrame = arbitrator->AcquireFocusOwner(ev, session->Tokenize(ev, kODKeyFocus));
  640.         if (focusFrame && ODObjectsAreEqual(ev, frame, focusFrame))
  641.             WARN("DisplayFrameClosed: Frame %x of Part %x still has key focus", frame, _fPart);
  642.         }
  643.         {
  644.         TempODFrame focusFrame = arbitrator->AcquireFocusOwner(ev, session->Tokenize(ev, kODScrollingFocus));
  645.         if (focusFrame && ODObjectsAreEqual(ev, frame, focusFrame))
  646.             WARN("DisplayFrameClosed: Frame %x of Part %x still has scrolling focus", frame, _fPart);
  647.         }
  648.         {
  649.         TempODFrame focusFrame = arbitrator->AcquireFocusOwner(ev, session->Tokenize(ev, kODClipboardFocus));
  650.         if (focusFrame && ODObjectsAreEqual(ev, frame, focusFrame))
  651.             WARN("DisplayFrameClosed: Frame %x of Part %x still has clipboard focus", frame, _fPart);
  652.         }
  653.  
  654. #endif
  655.  
  656.     SOM_CATCH_ALL
  657.     SOM_ENDTRY
  658. }
  659.  
  660. SOM_Scope void  SOMLINK ODPartWrapperAttachSourceFrame(ODPartWrapper *somSelf, Environment *ev,
  661.         ODFrame* frame,
  662.         ODFrame* sourceFrame)
  663. {
  664.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  665.  
  666.     SOM_TRY
  667.  
  668.     _fPart->AttachSourceFrame(ev,frame,sourceFrame);
  669.  
  670.     SOM_CATCH_ALL
  671.     SOM_ENDTRY
  672. }
  673.  
  674. SOM_Scope void  SOMLINK ODPartWrapperFrameShapeChanged(ODPartWrapper *somSelf, Environment *ev,
  675.         ODFrame* frame)
  676. {
  677.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  678.  
  679.     SOM_TRY
  680.  
  681.     _fPart->FrameShapeChanged(ev,frame);
  682.  
  683.     SOM_CATCH_ALL
  684.     SOM_ENDTRY
  685. }
  686.  
  687. SOM_Scope void  SOMLINK ODPartWrapperViewTypeChanged(ODPartWrapper *somSelf, Environment *ev,
  688.         ODFrame* frame)
  689. {
  690.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  691.  
  692.     SOM_TRY
  693.  
  694.     _fPart->ViewTypeChanged(ev,frame);
  695.  
  696.     SOM_CATCH_ALL
  697.     SOM_ENDTRY
  698. }
  699.  
  700. SOM_Scope void  SOMLINK ODPartWrapperPresentationChanged(ODPartWrapper *somSelf, Environment *ev,
  701.         ODFrame* frame)
  702. {
  703.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  704.  
  705.     SOM_TRY
  706.  
  707.     _fPart->PresentationChanged(ev,frame);
  708.  
  709.     SOM_CATCH_ALL
  710.     SOM_ENDTRY
  711. }
  712.  
  713. SOM_Scope void  SOMLINK ODPartWrapperSequenceChanged(ODPartWrapper *somSelf, Environment *ev,
  714.         ODFrame* frame)
  715. {
  716.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  717.  
  718.     SOM_TRY
  719.  
  720.     _fPart->SequenceChanged(ev,frame);
  721.  
  722.     SOM_CATCH_ALL
  723.     SOM_ENDTRY
  724. }
  725.  
  726. SOM_Scope ODInfoType  SOMLINK ODPartWrapperReadPartInfo(ODPartWrapper *somSelf, Environment *ev,
  727.         ODFrame* frame,
  728.         ODStorageUnitView* storageUnitView)
  729. {
  730.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  731.     ODInfoType partInfo = kODNULL;
  732.     
  733.     SOM_TRY
  734.  
  735.     partInfo = _fPart->ReadPartInfo(ev,frame,storageUnitView);
  736.  
  737.     SOM_CATCH_ALL
  738.     SOM_ENDTRY
  739.     
  740.     return partInfo;
  741. }
  742.  
  743. SOM_Scope void  SOMLINK ODPartWrapperWritePartInfo(ODPartWrapper *somSelf, Environment *ev,
  744.         ODInfoType partInfo,
  745.         ODStorageUnitView* storageUnitView)
  746. {
  747.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  748.  
  749.     SOM_TRY
  750.  
  751.     _fPart->WritePartInfo(ev,partInfo,storageUnitView);
  752.  
  753.     SOM_CATCH_ALL
  754.     SOM_ENDTRY
  755. }
  756.  
  757. SOM_Scope void  SOMLINK ODPartWrapperClonePartInfo(ODPartWrapper *somSelf, Environment *ev,
  758.         ODDraftKey key,
  759.         ODInfoType partInfo,
  760.         ODStorageUnitView* storageUnitView,
  761.         ODFrame* scopeFrame)
  762. {
  763.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  764.  
  765.     SOM_TRY
  766.  
  767.     _fPart->ClonePartInfo(ev,key,partInfo,storageUnitView,scopeFrame);
  768.  
  769.     SOM_CATCH_ALL
  770.     SOM_ENDTRY
  771. }
  772.  
  773. SOM_Scope ODID  SOMLINK ODPartWrapperOpen(ODPartWrapper *somSelf, Environment *ev,
  774.         ODFrame* frame)
  775. {
  776.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  777.     ODID    id = 0;
  778.     
  779.     SOM_TRY
  780.  
  781.     id = _fPart->Open(ev,frame);
  782.  
  783.     SOM_CATCH_ALL
  784.     SOM_ENDTRY
  785.     
  786.     return id;
  787. }
  788.  
  789. SOM_Scope ODFrame*  SOMLINK ODPartWrapperRequestEmbeddedFrame(ODPartWrapper *somSelf, Environment *ev,
  790.         ODFrame* containingFrame,
  791.         ODFrame* baseFrame,
  792.         ODShape* frameShape,
  793.         ODPart* embedPart,
  794.         ODTypeToken viewType,
  795.         ODTypeToken presentation,
  796.         ODBoolean isOverlaid)
  797. {
  798.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  799.     ODFrame*    frame = kODNULL;
  800.     
  801.     SOM_TRY
  802.  
  803.     frame = _fPart->RequestEmbeddedFrame(ev,containingFrame,baseFrame,frameShape,embedPart,viewType,presentation,isOverlaid);
  804.  
  805.     SOM_CATCH_ALL
  806.     SOM_ENDTRY
  807.     
  808.     return frame;
  809. }
  810.  
  811. SOM_Scope void  SOMLINK ODPartWrapperRemoveEmbeddedFrame(ODPartWrapper *somSelf, Environment *ev,
  812.         ODFrame* embeddedFrame)
  813. {
  814.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  815.  
  816.     SOM_TRY
  817.  
  818.     _fPart->RemoveEmbeddedFrame(ev,embeddedFrame);
  819.  
  820.     SOM_CATCH_ALL
  821.     SOM_ENDTRY
  822. }
  823.  
  824. SOM_Scope ODShape*  SOMLINK ODPartWrapperRequestFrameShape(ODPartWrapper *somSelf, Environment *ev,
  825.         ODFrame* embeddedFrame,
  826.         ODShape* frameShape)
  827. {
  828.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  829.     ODShape*    shape = kODNULL;
  830.     
  831.     SOM_TRY
  832.  
  833.     shape = _fPart->RequestFrameShape(ev,embeddedFrame,frameShape);
  834.  
  835.     SOM_CATCH_ALL
  836.     SOM_ENDTRY
  837.     
  838.     return shape;
  839. }
  840.  
  841. SOM_Scope void  SOMLINK ODPartWrapperUsedShapeChanged(ODPartWrapper *somSelf, Environment *ev,
  842.         ODFrame* embeddedFrame)
  843. {
  844.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  845.  
  846.     SOM_TRY
  847.  
  848.     _fPart->UsedShapeChanged(ev,embeddedFrame);
  849.  
  850.     SOM_CATCH_ALL
  851.     SOM_ENDTRY
  852. }
  853.  
  854. SOM_Scope ODShape*  SOMLINK ODPartWrapperAdjustBorderShape(ODPartWrapper *somSelf, Environment *ev,
  855.         ODFacet* embeddedFacet,
  856.         ODShape* shape)
  857. {
  858.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  859.     ODShape*    borderShape = kODNULL;
  860.     
  861.     SOM_TRY
  862.  
  863.     borderShape = _fPart->AdjustBorderShape(ev,embeddedFacet,shape);
  864.  
  865.     SOM_CATCH_ALL
  866.     SOM_ENDTRY
  867.     
  868.     return borderShape;
  869. }
  870.  
  871. SOM_Scope void  SOMLINK ODPartWrapperFacetAdded(ODPartWrapper *somSelf, Environment *ev,
  872.         ODFacet* facet)
  873. {
  874.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  875.  
  876.     SOM_TRY
  877.  
  878.     _fPart->FacetAdded(ev,facet);
  879.  
  880.     SOM_CATCH_ALL
  881.     SOM_ENDTRY
  882. }
  883.  
  884. SOM_Scope void  SOMLINK ODPartWrapperFacetRemoved(ODPartWrapper *somSelf, Environment *ev,
  885.         ODFacet* facet)
  886. {
  887.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  888.  
  889.     SOM_TRY
  890.  
  891.     _fPart->FacetRemoved(ev,facet);
  892.  
  893.     SOM_CATCH_ALL
  894.     SOM_ENDTRY
  895. }
  896.  
  897. SOM_Scope void  SOMLINK ODPartWrapperCanvasChanged(ODPartWrapper *somSelf, Environment *ev,
  898.         ODFacet* facet)
  899. {
  900.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  901.  
  902.     SOM_TRY
  903.  
  904.     _fPart->CanvasChanged(ev,facet);
  905.  
  906.     SOM_CATCH_ALL
  907.     SOM_ENDTRY
  908. }
  909.  
  910. SOM_Scope void  SOMLINK ODPartWrapperGeometryChanged(ODPartWrapper *somSelf, Environment *ev,
  911.         ODFacet* facet,
  912.         ODBoolean clipShapeChanged,
  913.         ODBoolean externalTransformChanged)
  914. {
  915.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  916.  
  917.     SOM_TRY
  918.  
  919.     _fPart->GeometryChanged(ev,facet,clipShapeChanged,externalTransformChanged);
  920.  
  921.     SOM_CATCH_ALL
  922.     SOM_ENDTRY
  923. }
  924.  
  925. SOM_Scope void  SOMLINK ODPartWrapperDraw(ODPartWrapper *somSelf, Environment *ev,
  926.         ODFacet* facet,
  927.         ODShape* invalidShape)
  928. {
  929.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  930.  
  931.     SOM_TRY
  932.  
  933.     _fPart->Draw(ev,facet,invalidShape);
  934.  
  935.     SOM_CATCH_ALL
  936.     SOM_ENDTRY
  937. }
  938.  
  939. SOM_Scope void  SOMLINK ODPartWrapperCanvasUpdated(ODPartWrapper *somSelf, Environment *ev,
  940.         ODCanvas* canvas)
  941. {
  942.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  943.  
  944.     SOM_TRY
  945.  
  946.     _fPart->CanvasUpdated(ev,canvas);
  947.  
  948.     SOM_CATCH_ALL
  949.     SOM_ENDTRY
  950. }
  951.  
  952. SOM_Scope void  SOMLINK ODPartWrapperHighlightChanged(ODPartWrapper *somSelf, Environment *ev,
  953.         ODFacet* facet)
  954. {
  955.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  956.  
  957.     SOM_TRY
  958.  
  959.     _fPart->HighlightChanged(ev,facet);
  960.  
  961.     SOM_CATCH_ALL
  962.     SOM_ENDTRY
  963. }
  964.  
  965. SOM_Scope ODULong  SOMLINK ODPartWrapperGetPrintResolution(ODPartWrapper *somSelf, Environment *ev,
  966.         ODFrame* frame)
  967. {
  968.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  969.     ODULong    printRes = 0;
  970.     
  971.     SOM_TRY
  972.  
  973.     printRes = _fPart->GetPrintResolution(ev,frame);
  974.  
  975.     SOM_CATCH_ALL
  976.     SOM_ENDTRY
  977.     
  978.     return printRes;
  979. }
  980.  
  981. SOM_Scope ODLinkSource*  SOMLINK ODPartWrapperCreateLink(ODPartWrapper *somSelf, Environment *ev,
  982.         ODByteArray* data)
  983. {
  984.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  985.     ODLinkSource*    link = kODNULL;
  986.     
  987.     SOM_TRY
  988.  
  989.     link = _fPart->CreateLink(ev,data);
  990.  
  991.     SOM_CATCH_ALL
  992.     SOM_ENDTRY
  993.     
  994.     return link;
  995. }
  996.  
  997. SOM_Scope void  SOMLINK ODPartWrapperLinkUpdated(ODPartWrapper *somSelf, Environment *ev,
  998.         ODLink* updatedLink,
  999.         ODUpdateID change)
  1000. {
  1001.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  1002.  
  1003.     SOM_TRY
  1004.  
  1005.     _fPart->LinkUpdated(ev,updatedLink,change);
  1006.  
  1007.     SOM_CATCH_ALL
  1008.     SOM_ENDTRY
  1009. }
  1010.  
  1011. SOM_Scope void  SOMLINK ODPartWrapperRevealLink(ODPartWrapper *somSelf, Environment *ev,
  1012.         ODLinkSource* linkSource)
  1013. {
  1014.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  1015.  
  1016.     SOM_TRY
  1017.  
  1018.     _fPart->RevealLink(ev,linkSource);
  1019.  
  1020.     SOM_CATCH_ALL
  1021.     SOM_ENDTRY
  1022. }
  1023.  
  1024. SOM_Scope void  SOMLINK ODPartWrapperEmbeddedFrameUpdated(ODPartWrapper *somSelf, Environment *ev,
  1025.         ODFrame* frame,
  1026.         ODUpdateID change)
  1027. {
  1028.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  1029.  
  1030.     SOM_TRY
  1031.  
  1032.     _fPart->EmbeddedFrameUpdated(ev,frame,change);
  1033.  
  1034.     SOM_CATCH_ALL
  1035.     SOM_ENDTRY
  1036. }
  1037.  
  1038. SOM_Scope ODBoolean SOMLINK ODPartWrapperEditInLinkAttempted(ODPartWrapper *somSelf, Environment *ev,
  1039.         ODFrame* frame)
  1040. {
  1041.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  1042.     ODBoolean result = kODFalse;
  1043.  
  1044.     SOM_TRY
  1045.  
  1046.     result = _fPart->EditInLinkAttempted(ev,frame);
  1047.  
  1048.     SOM_CATCH_ALL
  1049.     SOM_ENDTRY
  1050.  
  1051.     return result;
  1052. }
  1053.  
  1054. SOM_Scope void  SOMLINK ODPartWrapperLinkStatusChanged(ODPartWrapper *somSelf, Environment *ev,
  1055.         ODFrame* frame)
  1056. {
  1057.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  1058.  
  1059.     SOM_TRY
  1060.  
  1061.     _fPart->LinkStatusChanged(ev,frame);
  1062.  
  1063.     SOM_CATCH_ALL
  1064.     SOM_ENDTRY
  1065. }
  1066.  
  1067. SOM_Scope ODBoolean  SOMLINK ODPartWrapperBeginRelinquishFocus(ODPartWrapper *somSelf, Environment *ev,
  1068.         ODTypeToken focus,
  1069.         ODFrame* ownerFrame,
  1070.         ODFrame* proposedFrame)
  1071. {
  1072.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  1073.     ODBoolean    relinqFocus = kODFalse;
  1074.     
  1075.     SOM_TRY
  1076.  
  1077.     relinqFocus = _fPart->BeginRelinquishFocus(ev,focus,ownerFrame,proposedFrame);
  1078.  
  1079.     SOM_CATCH_ALL
  1080.     SOM_ENDTRY
  1081.     
  1082.     return relinqFocus;
  1083. }
  1084.  
  1085. SOM_Scope void  SOMLINK ODPartWrapperCommitRelinquishFocus(ODPartWrapper *somSelf, Environment *ev,
  1086.         ODTypeToken focus,
  1087.         ODFrame* ownerFrame,
  1088.         ODFrame* proposedFrame)
  1089. {
  1090.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  1091.  
  1092.     SOM_TRY
  1093.  
  1094.     _fPart->CommitRelinquishFocus(ev,focus,ownerFrame,proposedFrame);
  1095.  
  1096.     SOM_CATCH_ALL
  1097.     SOM_ENDTRY
  1098. }
  1099.  
  1100. SOM_Scope void  SOMLINK ODPartWrapperAbortRelinquishFocus(ODPartWrapper *somSelf, Environment *ev,
  1101.         ODTypeToken focus,
  1102.         ODFrame* ownerFrame,
  1103.         ODFrame* proposedFrame)
  1104. {
  1105.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  1106.  
  1107.     SOM_TRY
  1108.  
  1109.     _fPart->AbortRelinquishFocus(ev,focus,ownerFrame,proposedFrame);
  1110.  
  1111.     SOM_CATCH_ALL
  1112.     SOM_ENDTRY
  1113. }
  1114.  
  1115. SOM_Scope void  SOMLINK ODPartWrapperFocusAcquired(ODPartWrapper *somSelf, Environment *ev,
  1116.         ODTypeToken focus,
  1117.         ODFrame* ownerFrame)
  1118. {
  1119.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  1120.  
  1121.     SOM_TRY
  1122.  
  1123.     _fPart->FocusAcquired(ev,focus,ownerFrame);
  1124.  
  1125.     SOM_CATCH_ALL
  1126.     SOM_ENDTRY
  1127. }
  1128.  
  1129. SOM_Scope void  SOMLINK ODPartWrapperFocusLost(ODPartWrapper *somSelf, Environment *ev,
  1130.         ODTypeToken focus,
  1131.         ODFrame* ownerFrame)
  1132. {
  1133.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  1134.  
  1135.     SOM_TRY
  1136.  
  1137.     _fPart->FocusLost(ev,focus,ownerFrame);
  1138.  
  1139.     SOM_CATCH_ALL
  1140.     SOM_ENDTRY
  1141. }
  1142.  
  1143. SOM_Scope void  SOMLINK ODPartWrapperInitObject(ODPartWrapper *somSelf, Environment *ev)
  1144. {
  1145.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  1146.  
  1147.     SOM_TRY
  1148.  
  1149.     _fPart->InitObject(ev);
  1150.  
  1151.     SOM_CATCH_ALL
  1152.     SOM_ENDTRY
  1153. }
  1154.  
  1155.  
  1156. SOM_Scope ODBoolean  SOMLINK ODPartWrapperHasExtension(ODPartWrapper *somSelf, Environment *ev,
  1157.         ODType extensionName)
  1158. {
  1159.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  1160.     ODBoolean    hasExt = kODFalse;
  1161.     
  1162.     SOM_TRY
  1163.  
  1164.     hasExt = _fPart->HasExtension(ev,extensionName);
  1165.  
  1166.     SOM_CATCH_ALL
  1167.     SOM_ENDTRY
  1168.  
  1169.     return hasExt;
  1170. }
  1171.  
  1172. SOM_Scope ODExtension*  SOMLINK ODPartWrapperAcquireExtension(ODPartWrapper *somSelf, Environment *ev,
  1173.         ODType extensionName)
  1174. {
  1175.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  1176.     ODExtension*    extName = kODNULL;
  1177.     
  1178.     SOM_TRY
  1179.  
  1180.     extName = _fPart->AcquireExtension(ev,extensionName);
  1181.  
  1182.     SOM_CATCH_ALL
  1183.     SOM_ENDTRY
  1184.  
  1185.     return extName;
  1186. }
  1187.  
  1188. SOM_Scope void  SOMLINK ODPartWrapperReleaseExtension(ODPartWrapper *somSelf, Environment *ev,
  1189.         ODExtension* extension)
  1190. {
  1191.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  1192.  
  1193.     SOM_TRY
  1194.  
  1195.     _fPart->ReleaseExtension(ev,extension);
  1196.  
  1197.     SOM_CATCH_ALL
  1198.     SOM_ENDTRY
  1199. }
  1200.  
  1201. SOM_Scope ODSize  SOMLINK ODPartWrapperPurge(ODPartWrapper *somSelf, Environment *ev,
  1202.         ODSize size)
  1203. {
  1204.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  1205.  
  1206.     ODSize    purgeSize = 0; ODVolatile( purgeSize );
  1207.     
  1208.     SOM_TRY
  1209.  
  1210.         purgeSize = _fPart->Purge(ev,size);
  1211.  
  1212.         purgeSize += parent_Purge(somSelf,ev,size);
  1213.     SOM_CATCH_ALL
  1214.         WARN("Error %ld trying to purge in ODPartWrapperPurge",ErrorCode());
  1215.         SetErrorCode(kODNoError);        // Eat the exception; Purge should not 
  1216.                                         // propagate it because clients function
  1217.                                         // fine whether memory was purged or not.
  1218.     SOM_ENDTRY
  1219.  
  1220.     return purgeSize;
  1221. }
  1222.  
  1223. SOM_Scope ODBoolean  SOMLINK ODPartWrapperIsEqualTo(ODPartWrapper *somSelf, Environment *ev,
  1224.         ODObject* object)
  1225. {
  1226.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  1227.     ODBoolean    isEqualTo = kODFalse;
  1228.     
  1229.     SOM_TRY
  1230.  
  1231.     isEqualTo = _fPart->IsEqualTo(ev,object);
  1232.  
  1233.     SOM_CATCH_ALL
  1234.     SOM_ENDTRY
  1235.  
  1236.     return isEqualTo;
  1237. }
  1238.  
  1239. SOM_Scope void  SOMLINK ODPartWrapperSubClassResponsibility(ODPartWrapper *somSelf, Environment *ev)
  1240. {
  1241.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  1242.  
  1243.  
  1244.     //_fPart->SubClassResponsibility(ev);
  1245.  
  1246.     WARN("A subclass should have overridden this method!");
  1247.     ODSetSOMException(ev,kODErrSubClassResponsibility, "SubClass Responsibility");
  1248. }
  1249.  
  1250. SOM_Scope void  SOMLINK ODPartWrapperInitRefCntObject(ODPartWrapper *somSelf, Environment *ev)
  1251. {
  1252.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  1253.  
  1254.     SOM_TRY
  1255.  
  1256.     _fPart->InitRefCntObject(ev);
  1257.  
  1258.     SOM_CATCH_ALL
  1259.     SOM_ENDTRY
  1260. }
  1261.  
  1262. SOM_Scope void  SOMLINK ODPartWrapperAcquire(ODPartWrapper *somSelf, Environment *ev)
  1263. {
  1264.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  1265.  
  1266.     SOM_TRY
  1267.  
  1268.     _fPart->Acquire(ev);
  1269.  
  1270.     SOM_CATCH_ALL
  1271.     SOM_ENDTRY
  1272. }
  1273.  
  1274. SOM_Scope void  SOMLINK ODPartWrapperRelease(ODPartWrapper *somSelf, Environment *ev)
  1275. {
  1276.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  1277.  
  1278.     SOM_TRY
  1279.  
  1280.     if( _fPart ) {
  1281.         _fPart->Release(ev);
  1282.         if ( _fPart->GetRefCount(ev) == 0 ) {
  1283.             _fPart->GetStorageUnit(ev)->GetDraft(ev)->ReleasePart(ev, somSelf);
  1284.         }
  1285.     }
  1286.     
  1287.     SOM_CATCH_ALL
  1288.     SOM_ENDTRY
  1289. }
  1290.  
  1291. SOM_Scope ODULong  SOMLINK ODPartWrapperGetRefCount(ODPartWrapper *somSelf, Environment *ev)
  1292. {
  1293.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  1294.     ODULong    refCount = 0;
  1295.     
  1296.     SOM_TRY
  1297.  
  1298.     refCount = _fPart->GetRefCount(ev);
  1299.  
  1300.     SOM_CATCH_ALL
  1301.     SOM_ENDTRY
  1302.  
  1303.     return refCount;
  1304. }
  1305.  
  1306. SOM_Scope void  SOMLINK ODPartWrapperInitPersistentObject(ODPartWrapper *somSelf, Environment *ev,
  1307.         ODStorageUnit* storageUnit)
  1308. {
  1309.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  1310.  
  1311.     SOM_TRY
  1312.  
  1313.     _fPart->InitPersistentObject(ev,storageUnit);
  1314.  
  1315.     SOM_CATCH_ALL
  1316.     SOM_ENDTRY
  1317. }
  1318.  
  1319. SOM_Scope void  SOMLINK ODPartWrapperInitPersistentObjectFromStorage(ODPartWrapper *somSelf, Environment *ev,
  1320.         ODStorageUnit* storageUnit)
  1321. {
  1322.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  1323.  
  1324.     SOM_TRY
  1325.  
  1326.      _fPart->InitPersistentObjectFromStorage(ev,storageUnit);
  1327.  
  1328.     SOM_CATCH_ALL
  1329.     SOM_ENDTRY
  1330. }
  1331.  
  1332. SOM_Scope void  SOMLINK ODPartWrapperReleaseAll(ODPartWrapper *somSelf, Environment *ev)
  1333. {
  1334.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  1335.  
  1336.     SOM_TRY
  1337.     
  1338.     _fPart->ReleaseAll(ev);
  1339.  
  1340.     SOM_CATCH_ALL
  1341.     SOM_ENDTRY
  1342. }
  1343.  
  1344. SOM_Scope void  SOMLINK ODPartWrapperExternalize(ODPartWrapper *somSelf, Environment *ev)
  1345. {
  1346.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  1347.  
  1348.     SOM_TRY
  1349.  
  1350.     _fPart->Externalize(ev);
  1351.     
  1352.     SOM_CATCH_ALL
  1353.     SOM_ENDTRY
  1354. }
  1355.  
  1356. SOM_Scope ODStorageUnit*  SOMLINK ODPartWrapperGetStorageUnit(ODPartWrapper *somSelf, Environment *ev)
  1357. {
  1358.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  1359.  
  1360.     SOM_CATCH return kODNULL;
  1361.  
  1362.     return (_fPart->GetStorageUnit(ev));
  1363. }
  1364.  
  1365. SOM_Scope ODID  SOMLINK ODPartWrapperGetID(ODPartWrapper *somSelf, Environment *ev)
  1366. {
  1367.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  1368.  
  1369.     SOM_CATCH return 0;
  1370.  
  1371.     return (_fPart->GetID(ev));
  1372. }
  1373.  
  1374. SOM_Scope void  SOMLINK ODPartWrapperCloneInto(ODPartWrapper *somSelf, Environment *ev,
  1375.         ODDraftKey key,
  1376.         ODStorageUnit* storageUnit,
  1377.         ODFrame* initiatingFrame)
  1378. {
  1379.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  1380.  
  1381.     SOM_TRY
  1382.  
  1383.     _fPart->CloneInto(ev,key,storageUnit,initiatingFrame);
  1384.  
  1385.     SOM_CATCH_ALL
  1386.     SOM_ENDTRY
  1387. }
  1388.  
  1389. SOM_Scope void  SOMLINK ODPartWrapperExternalizeKinds(ODPartWrapper *somSelf, Environment *ev,
  1390.         ODTypeList* kindset)
  1391. {
  1392.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  1393.  
  1394.     SOM_TRY
  1395.  
  1396.     _fPart->ExternalizeKinds(ev,kindset);
  1397.  
  1398.     SOM_CATCH_ALL
  1399.     SOM_ENDTRY
  1400. }
  1401.  
  1402. SOM_Scope void  SOMLINK ODPartWrapperChangeKind(ODPartWrapper *somSelf, Environment *ev,
  1403.         ODType kind)
  1404. {
  1405.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  1406.  
  1407.     SOM_TRY
  1408.  
  1409.     _fPart->ChangeKind(ev,kind);
  1410.  
  1411.     SOM_CATCH_ALL
  1412.     SOM_ENDTRY
  1413. }
  1414.  
  1415. SOM_Scope ODBoolean  SOMLINK ODPartWrapperIsRealPart(ODPartWrapper *somSelf, Environment *ev)
  1416. {
  1417.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  1418.  
  1419.     return kODFalse;
  1420. }
  1421.  
  1422. SOM_Scope ODPart*  SOMLINK ODPartWrapperGetRealPart(ODPartWrapper *somSelf, Environment *ev)
  1423. {
  1424.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  1425.     ODPart*    realPart = kODNULL;
  1426.     
  1427.     SOM_TRY
  1428.  
  1429.     if ( _fPartInUse )
  1430.         THROW(kODErrPartInUse);
  1431.     else
  1432.     {
  1433.         _fPartInUse = kODTrue;
  1434.         realPart = _fPart;
  1435.     }
  1436.  
  1437.     SOM_CATCH_ALL
  1438.     SOM_ENDTRY
  1439.  
  1440.     return realPart;
  1441. }
  1442.  
  1443. SOM_Scope void  SOMLINK ODPartWrapperReleaseRealPart(ODPartWrapper *somSelf, Environment *ev)
  1444. {
  1445.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  1446.  
  1447.     SOM_TRY
  1448.  
  1449.     _fPartInUse = kODFalse;
  1450.  
  1451.     SOM_CATCH_ALL
  1452.     SOM_ENDTRY
  1453. }
  1454.  
  1455. SOM_Scope ODBoolean  SOMLINK ODPartWrapperHandleEvent(ODPartWrapper *somSelf, Environment *ev,
  1456.         ODEventData* event,
  1457.         ODFrame* frame,
  1458.         ODFacet* facet,
  1459.         ODEventInfo* eventInfo)
  1460. {
  1461.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  1462.     ODBoolean    eventHandled = kODFalse;
  1463.     
  1464.     SOM_TRY
  1465.  
  1466.     eventHandled = _fPart->HandleEvent(ev,event,frame,facet, eventInfo);
  1467.  
  1468.     SOM_CATCH_ALL
  1469.     SOM_ENDTRY
  1470.  
  1471.     return eventHandled;
  1472. }
  1473.  
  1474. SOM_Scope void  SOMLINK ODPartWrapperAdjustMenus(ODPartWrapper *somSelf, Environment *ev,
  1475.         ODFrame* frame)
  1476. {
  1477.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  1478.  
  1479.     SOM_TRY
  1480.  
  1481.     _fPart->AdjustMenus(ev,frame);
  1482.  
  1483.     SOM_CATCH_ALL
  1484.     SOM_ENDTRY
  1485. }
  1486.  
  1487. SOM_Scope void  SOMLINK ODPartWrapperUndoAction(ODPartWrapper *somSelf, Environment *ev,
  1488.         ODActionData* actionState)
  1489. {
  1490.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  1491.  
  1492.     SOM_TRY
  1493.  
  1494.     _fPart->UndoAction(ev,actionState);
  1495.  
  1496.     SOM_CATCH_ALL
  1497.     SOM_ENDTRY
  1498. }
  1499.  
  1500. SOM_Scope void  SOMLINK ODPartWrapperRedoAction(ODPartWrapper *somSelf, Environment *ev,
  1501.         ODActionData* actionState)
  1502. {
  1503.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  1504.  
  1505.     SOM_TRY
  1506.  
  1507.     _fPart->RedoAction(ev,actionState);
  1508.  
  1509.     SOM_CATCH_ALL
  1510.     SOM_ENDTRY
  1511. }
  1512.  
  1513. SOM_Scope void  SOMLINK ODPartWrapperDisposeActionState(ODPartWrapper *somSelf, Environment *ev,
  1514.         ODActionData* actionState,
  1515.         ODDoneState doneState)
  1516. {
  1517.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  1518.  
  1519.     SOM_TRY
  1520.  
  1521.     _fPart->DisposeActionState(ev,actionState,doneState);
  1522.  
  1523.     SOM_CATCH_ALL
  1524.     SOM_ENDTRY
  1525. }
  1526.  
  1527. SOM_Scope void  SOMLINK ODPartWrapperWriteActionState(ODPartWrapper *somSelf, Environment *ev,
  1528.         ODActionData* actionState,
  1529.         ODStorageUnitView* storageUnitView)
  1530. {
  1531.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  1532.  
  1533.     SOM_TRY
  1534.  
  1535.     _fPart->WriteActionState(ev,actionState,storageUnitView);
  1536.  
  1537.     SOM_CATCH_ALL
  1538.     SOM_ENDTRY
  1539. }
  1540.  
  1541. SOM_Scope ODActionData  SOMLINK ODPartWrapperReadActionState(ODPartWrapper *somSelf, Environment *ev,
  1542.         ODStorageUnitView* storageUnitView)
  1543. {
  1544.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  1545.  
  1546.     ODActionData data;
  1547.     data._maximum = 0;
  1548.     data._length = 0;
  1549.     data._buffer = kODNULL;
  1550.  
  1551.     SOM_TRY
  1552.  
  1553.     data = _fPart->ReadActionState(ev,storageUnitView);
  1554.  
  1555.     SOM_CATCH_ALL
  1556.     SOM_ENDTRY
  1557.  
  1558.     return data;
  1559. }
  1560.  
  1561. SOM_Scope void  SOMLINK ODPartWrapperInitPart(ODPartWrapper *somSelf, Environment *ev,
  1562.         ODStorageUnit* storageUnit, ODPart* partWrapper)
  1563. {
  1564.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  1565.  
  1566.     SOM_TRY
  1567.  
  1568.     _fPart->InitPart(ev,storageUnit, somSelf);
  1569.  
  1570.     SOM_CATCH_ALL
  1571.     SOM_ENDTRY
  1572. }
  1573.  
  1574. SOM_Scope void  SOMLINK ODPartWrapperInitPartFromStorage(ODPartWrapper *somSelf, Environment *ev,
  1575.         ODStorageUnit* storageUnit, ODPart* partWrapper)
  1576. {
  1577.     ODPartWrapperData *somThis = ODPartWrapperGetData(somSelf);
  1578.  
  1579.     SOM_TRY
  1580.  
  1581.     _fPart->InitPartFromStorage(ev,storageUnit, somSelf);
  1582.  
  1583.     SOM_CATCH_ALL
  1584.     SOM_ENDTRY
  1585. }
  1586.